﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using ProyectoVeranoAECAasp.AccesoDatos.Clases;
using ProyectoVeranoAECAasp.AccesoDatos.ClasesMiscelaneas;

namespace ProyectoVeranoAECAasp.Negocios.Clases
{
    public class ProcesosSolicitarReservacion
    {
        ProcedimientosBaseDatos negociadorBaseDatos;


         // - CONSTRUCTOR -----
        public ProcesosSolicitarReservacion()
        {
            negociadorBaseDatos = new ProcedimientosBaseDatos();
        }


        // - METODOS -----
        // - llamar_ejecutaSP_ObtenerListaEspacios: para llamar al método de la capa
        // de acceso a datos que permite obtener los espacios disponibles
        public List<String> llamar_ejecutaSP_ObtenerListaEspacios()
        {
            return negociadorBaseDatos.ejecutaSP_ObtenerListaEspacios();
        }

        // - llamar_ejecutaSP_ObtenerListaEscuelas: para llamar al método de la capa
        // de acceso a datos que permite obtener las escuelas disponibles
        public List<String> llamar_ejecutaSP_ObtenerListaEscuelas()
        {
            return negociadorBaseDatos.ejecutaSP_ObtenerListaEscuelas();
        }

        // - llamar_ejecutaSP_ObtenerListaCarrerasXEscuela: para llamar al método de la capa
        // de acceso a datos que permite obtener las carreras x escuela
        public List<String> llamar_ejecutaSP_ObtenerListaCarrerasXEscuela(int p_IDEscuela)
        {
            return negociadorBaseDatos.ejecutaSP_ObtenerListaCarrerasXEscuela(p_IDEscuela);
        }

        // - llamar_ejecutaSP_ObtenerHorasAsuntoUserXEspacioResXFecha: para llamar al método de la capa
        // de acceso a datos que permite obtener el horario de un espacio en una fecha
        // dada
        public List<Elementos_SP_ObtenerHorasAsuntoUserXEspacioResXFecha> llamar_ejecutaSP_ObtenerHorasAsuntoUserXEspacioResXFecha(String p_Fecha,
            String p_IDEspacio)
        {
            return negociadorBaseDatos.ejecutaSP_ObtenerHorasAsuntoUserXEspacioResXFecha(p_Fecha,
               p_IDEspacio);
        }

        // - llamar_traerHorasADisposicion: para llamar al método de la capa
        // de acceso a datos que permite obtener el horario disponible de reservaciones
        public List<String> llamar_traerHorasADisposicion()
        {
            return negociadorBaseDatos.traerHorasADisposicion();
        }

        // - llamar_ejecutaSP_HacerSolicitud_SP_HacerHorario: para llamar a los métodos que
        // ejecutan los SP de solicitud y horario
        public int llamar_ejecutaSP_HacerSolicitud_SP_HacerHorario(int p_seReservaTodo, String p_asuntoSolicitud, 
            int p_idEscuelaSolicitud, int p_idCarreraSolicitud, String p_descripcionSolicitud, 
            int p_cantidadHorasReservadas, DateTime p_fechaReservar, List<String> p_listaHorasAReservar,
            String p_espacioReservar, int p_IDUsuarioEmisor)
        {
            int IDSolicitud = 0;
            //---- Llamar a SP_HacerSolicitud
            IDSolicitud = negociadorBaseDatos.ejecutaSP_HacerSolicitud(p_asuntoSolicitud, 
                p_idEscuelaSolicitud, p_idCarreraSolicitud, p_descripcionSolicitud,
                p_cantidadHorasReservadas, p_fechaReservar, p_espacioReservar, p_IDUsuarioEmisor);
            //----
            if (IDSolicitud != -1)
            {
                // Si se pudo realizar con éxito la solicitud
                // sele da un horario
                if (p_seReservaTodo == 1)
                {
                    // Si se reserva todo
                    negociadorBaseDatos.ejecutaSP_IngresarUnaHoraSolicitud(IDSolicitud,
                        p_seReservaTodo, "", 2);
                }
                else
                {
                    String hora;
                    String modalidadString;
                    int modalidad;
                    for (int i = 0; i < p_listaHorasAReservar.Count; i++)
                    {
                        hora = p_listaHorasAReservar[i].Substring(0, 5);
                        modalidadString = p_listaHorasAReservar[i].Substring(6, 4);
                        if(modalidadString == "a.m.")
                        {
                            modalidad = 0;
                        }
                        else
                        {
                            modalidad = 1;
                        }
                        // Si se reserva 1 hora (la actual)
                        negociadorBaseDatos.ejecutaSP_IngresarUnaHoraSolicitud(IDSolicitud,
                            p_seReservaTodo, hora, modalidad);
                    }
                }
                return IDSolicitud;
            }
            else
            {
                // Si no, se sube el resultado y se termina el proceso
                return IDSolicitud;
            }
            //----
        }
    }
}
